#ifndef DELAY_H_
#define DELAY_H_

#include "../../SAMA_Function.h"
#define DELAY_TIME_ARRAY 201

typedef struct {
	float Init_Value;         //< 初始值 
}DELAY_Par_t;



typedef struct {
	int Time_Sum;           //< 记录当前运行时间（步数） 
	int Index;
	//< Shike20210506 以下是为了解决延迟时间在线时增大或者减小，即延迟时间发生变化后，模块输出不正常的问题
	float TimeNotAchievedHoldValue;		//< Shike20210506 延迟时间未达到上位设置的时间，需要保持引脚输出的数值
	bool Flag_TimeNotAchievedHoldValue;	//< Shike20210506 延迟时间未达到上位设置的时间，需要保持引脚输出的标志位
	int TimeNotAchievedIndexMemory;		//< Shike20210506 延迟时间未达到上位设置的时间且索引Index不在开头，这个用来记录延迟增大造成有一段数据乱序的情况，比如延迟从3s增大到13s，这一瞬间Index在3s中间位置，从中间位置到3s这一段应该重排到数组开头
	int LastAllDelayStep;				//< Shike20210506 记录上一次运算的延迟时间参数
	int TimeNotAchievedAllDelayStepMemory;//< Shike20210506 延迟时间参数手动改长，导致延迟时间未达到上位设置的时间且索引Index不在开头，记录之前的AllDelayStep
	float Mid[DELAY_TIME_ARRAY];
}DELAY_Sta_t;



struct DELAY_T
{
	Model_Base_t Base;	    //< 模块基本参数结构体
	DELAY_Par_t Par;		//< 模块可调参数结构体
	DELAY_Sta_t Sta;		//< 模块运算中间参数结构体
};


extern DELAY_T* DELAY_t;


bool CALCU_SAMA(DELAY)(Model_Base_t* arg, float dt, bool* DI, bool* DO, float* AI, float* AO);	   //< SAMA运算函数
int BC_PARA(DELAY)(Model_Base_t* arg, void** Data);											       //< 广播SAMA参数变量函数（无参数需要广播的模块直接将BCPara函数设置为NULL即可）
int BAK_STA(DELAY)(Model_Base_t* arg, void** Data);											       //< 备份SAMA运算中间参数
int ANA_STA(DELAY)(Model_Base_t* arg, void** Data);											       //< 解析备份的SAMA运算中间参数
int CHANGE_PAR(DELAY)(Model_Base_t* arg, void** Data);											   //< 在线修改模块参数函数
void INIT_STAPAR(DELAY)(Model_Base_t* arg);													       //< 初始化模块运算中间参数


#endif
